package com.atguigu.hashtab;

import java.util.Scanner;

/**
 * @author shkstart
 * @create 2021-08-16 13:18
 */
public class HashTabDemo {
    public static void main(String[] args) {
        //创建一个可以测试的哈希表
        HashTab hashTab = new HashTab(7);
        Scanner scanner = new Scanner(System.in);
        String key="";
        while (true){
            System.out.println("add:添加雇员");
            System.out.println("list:显示雇员");
            System.out.println("find:查找雇员");
            System.out.println("dell:删除雇员");
            System.out.println("exit:退出系统");
            key = scanner.next();
            switch (key){
                case "add":
                    System.out.println("请输入id");
                    int id = scanner.nextInt();
                    System.out.println("请输入名字");
                    String name=scanner.next();
                    Emp emp = new Emp(id, name);
                    hashTab.add(emp);
                    break;
                case "list":
                    hashTab.list();
                    break;
                case "find":
                    System.out.println("请输入要寻找的员工id");
                      id=scanner.nextInt();
                     hashTab.findEmpById(id);
                    break;
                case "dell":
                    System.out.println("请输入要删除的员工id");
                    id=scanner.nextInt();
                    hashTab.dell(id);
                    break;
                case "exit":
                    scanner.close();
                    System.exit(0);
            }
        }
    }
}
  //创建一个哈希表
 class HashTab{
    //链表的条数
    private int size;
    //链表的数组
    private EmpLinkedList[] empLinkedListArray;
    //构造器

      public HashTab(int size) {
          this.size = size;
          empLinkedListArray = new EmpLinkedList[size];
          //初始化每一个数组内部，至少有一个链表
          for (int i=0;i<size;i++){
              empLinkedListArray[i] = new EmpLinkedList();
          }
      }
      //添加雇员
      public void add(Emp emp){
          //根据该员工的id，确定该员工应该添加到哪一条链表中
          int empLinkedListNo = hashFun(emp.id);
          //将emp链表添加进去
          empLinkedListArray[empLinkedListNo].add(emp);
      }
      //遍历链表
      public void list(){
          for (int i=0;i<size;i++){
              empLinkedListArray[i].list(i);
          }
      }
      //根据员工id，查找该员工的信息
      public void findEmpById(int id){
          //根据该员工的id确定该员工属于哪一个链表
          int empLinkedListNO = hashFun(id);
          Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);
          if (emp!=null){
          System.out.println("第"+(empLinkedListNO+1)+"条链表的"+id+"号员工的信息为"+emp);
          }
          else {
              System.out.println("在哈希表中，找不到该员工的信息！");
          }
      }
      //根据员工id，删除员工的信息
      public void dell(int id){
          int empLinkedListNO = hashFun(id);
          boolean flag = empLinkedListArray[empLinkedListNO].del(id);
          if (flag){
              System.out.println("已经成功删除第"+(empLinkedListNO+1)+"条链表编号为"+id+"的员工");
          }else {
              System.out.println("没有找到对应的编号"+id);
          }


      }
      //散列函数，取模法
      public int hashFun(int id){
          return id%size;
      }
  }
    //创建一个雇员
  class Emp{
    public int id;
    public String name;
    public Emp next;
    //创建一个构造器
        public Emp(int id, String name) {
            this.id = id;
            this.name = name;
        }

        @Override
        public String toString() {
            return "Emp{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }
    //创建一个链表
class EmpLinkedList{
    //头指针
        public Emp head;
        //添加链表，直接添加到最后
        public void add(Emp emp){
            //如果头指针为空，那直接添加
            if(head==null){
                head=emp;
                return;
            }
            //如果头指针不为空，那就遍历循环到最后一个节点，添加进去
            Emp curEmp=head;
            while (true){
                //确立跳出的规则
                if (curEmp.next==null){
                    break;
                }
                //往下一个移动
                curEmp=curEmp.next;
            }
            //赋值
            curEmp.next=emp;
        }

        //遍历节点
        public void list(int no){
            if (head==null){
                System.out.println("第"+(no+1)+"链表为空！");
                return;
            }
            Emp curEmp=head;
            System.out.println("第"+(no+1)+"链表的信息如下");
            while (true){
                System.out.println(curEmp.toString());
                if (curEmp.next==null){
                    break;
                }

                curEmp=curEmp.next;
            }
            System.out.println();
        }
        //根据id号，寻找该员工
        public Emp  findEmpById(int id){
            if (head==null){
                System.out.println("该链表为空！");
                return null;
            }
            Emp curEmp=head;
            while (true){
                //找到该员工，跳出循环
                if (curEmp.id==id){
                    break;
                }
                //没有找到，则置为空
                if (curEmp.next==null){
                    curEmp=null;
                    break;
                }
                curEmp=curEmp.next;
            }
            return curEmp;
        }
        //根据员工id删除员工
        public boolean del(int id){
            boolean flag=false;
            if (head==null){
                System.out.println("该链表为空");
                return flag;
            }
            if (head.id==id){
                flag=true;
                head=null;
                return flag;
            }
            Emp curEmp=head;
            while (true){

                if (curEmp.next.id==id){
                   flag=true;
                   curEmp.next=curEmp.next.next;
                   break;
                }
                if (curEmp.next==null){
                    break;
                }
                curEmp=curEmp.next;
            }
            return flag;
        }
    }
